﻿''============================================================================
''PTIC_gestBDD - Composants de requetage / manipulation des bases de données
''Copyright © 2010 PIERRE TISSOT CONSEIL
''=============================================================================


Imports System.Drawing
Imports System.Windows.Forms
Imports System.Runtime.Serialization.Formatters.Binary
Imports PTIC_Util

''' <summary>
''' Champs d'une table/requête représentant une clause WHERE
''' </summary>
''' <remarks></remarks>
Public Class ChampsTraitTranche
    Inherits Correspondance

    Protected _nomColMin As String
    Protected _nomColMax As String
    Protected _nomColVal As String
    Protected _masque As String

#Region "Constructeur"

    ''' <summary>
    ''' Permet de créer une correspondance calculée représentant un WHEN non rattachée à un traitement
    ''' </summary>
    ''' <param name="descrCorresp"></param>
    ''' <param name="nomChOutil"></param>
    ''' <param name="tableCorresp"></param>
    ''' <remarks></remarks>
    Protected Friend Sub New(ByVal trait As Traitement, _
                             ByVal descrCorresp As String, _
                             ByVal nomChOutil As String, _
                             ByVal tableCorresp As DataTable, _
                             ByVal colMin As String, _
                             ByVal colMax As String, _
                             ByVal colVal As String, _
                             Optional ByVal masque As String = "{1}")

        MyBase.New(trait, descrCorresp)
        _typeChEntree = typeChEntreeMapping.TABLE
        _isAttachedToTraitement = False
        _TableTranches = tableCorresp
        _nomColMin = colMin
        _nomColMax = colMax
        _nomColVal = colVal
        _masque = masque
        _traitementExtractionTable = Nothing

        'Les champs dont la correspondance dépend sont ajoutés manuellement par l'utilisateur dans les
        'correspondances de formule
        Dim chSource As New ChampsBDD(masque, New FormatChamps(Type.GetType("System.String")))
        Dim chCible As New ChampsBDD(nomChOutil, New FormatChamps(Type.GetType("System.String")))

        setChSortie(chCible)
        setChEntree(chSource)

        'Ajout des dépendances de formule qui vont bien
        'Ajout des correspondances constitutives qui vont bien
        'Test à faire avant pour la fonctionnalité
    End Sub

    ''' <summary>
    ''' Permet de créer un champs calculé représentant un WHEN et dont la table des tranches est rattachée à un traitement
    ''' </summary>
    ''' <param name="trait"></param>
    ''' <param name="descrCorresp"></param>
    ''' <param name="nomChOutil"></param>
    ''' <param name="traitExtractionTable"></param>
    ''' <param name="colMin"></param>
    ''' <param name="colMax"></param>
    ''' <param name="colVal"></param>
    ''' <param name="masque"></param>
    ''' <remarks></remarks>
    Protected Friend Sub New(ByVal trait As Traitement, _
                             ByVal descrCorresp As String, _
                             ByVal nomChOutil As String, _
                             ByVal traitExtractionTable As tableBDD, _
                             ByVal colMin As String, _
                             ByVal colMax As String, _
                             ByVal colVal As String, _
                             Optional ByVal masque As String = "{1}")

        MyBase.New(trait, descrCorresp)
        _typeChEntree = typeChEntreeMapping.TABLE
        _TraitementExtractionTable = traitExtractionTable
        isAttachedToTraitement = True
        _nomColMin = colMin
        _nomColMax = colMax
        _nomColVal = colVal
        _masque = masque

        'Les champs dont la correspondance dépend sont ajoutés manuellement par l'utilisateur dans les
        'correspondances de formule
        Dim chSource As New ChampsBDD(masque, New FormatChamps(Type.GetType("System.String")))
        Dim chCible As New ChampsBDD(nomChOutil, New FormatChamps(Type.GetType("System.String")))

        setChSortie(chCible)
        setChEntree(chSource)

        'Ajout des dépendances de formule qui vont bien
        'Ajout des correspondances constitutives qui vont bien
        'Test à faire avant pour la fonctionnalité
    End Sub

#End Region

#Region "Propriétés"

    'Indique si le champs est synchronisé avec le traitement de type Table_BDD qui lui est rattaché
    'Si oui, la table de tranche est égale à la table extraite par Table_BDD (et donc en lecture seule)
    'Lorsque le traitement est "non calculable", le traitement auquel est associé la correspondance devient
    'également non calculable
    Private _isAttachedToTraitement As Boolean
    Public Property isAttachedToTraitement As Boolean
        Get
            Return _isAttachedToTraitement
        End Get
        Set(ByVal value As Boolean)
            OnPropertyChanging("isAttachedToTraitement")
            Dim e As New PropertyChangeEventArgs(Of Boolean)(isAttachedToTraitement, value)
            If e.IsValide Then RaiseEvent isAttachedToTraitementChanging(Me, e)
            If e.IsValide Then
                _isAttachedToTraitement = e.NewValue
                If _isAttachedToTraitement = False Then
                    If TableTranches Is Nothing Then
                        TableTranches = New DataTable
                        AddHandler _TableTranches.RowChanged, AddressOf _dtbleCorrespTranches_RowChanged
                    Else
                        TraitementExtractionTable.Calculer_DataTable()
                        RemoveHandler _TableTranches.RowChanged, AddressOf _dtbleCorrespTranches_RowChanged
                        _TableTranches = TraitementExtractionTable.DataTableResultat
                        AddHandler _TableTranches.RowChanged, AddressOf _dtbleCorrespTranches_RowChanged
                    End If
                End If
                OnPropertyChanged("isAttachedToTraitement")
                RaiseEvent isAttachedToTraitementChanged(Me, e)
            End If
        End Set
    End Property
    Public Event isAttachedToTraitementChanging As PropertyChangeEventHandler(Of Boolean)
    Public Event isAttachedToTraitementChanged As PropertyChangeEventHandler(Of Boolean)

    'La table des tranches
    Private WithEvents _TableTranches As DataTable
    Public Property TableTranches As DataTable
        Get
            If isAttachedToTraitement Then
                TraitementExtractionTable.Calculer_DataTable()
                _TableTranches = TraitementExtractionTable.DataTableResultat
            End If
            Return _TableTranches
        End Get
        Set(ByVal value As DataTable)
            If Not isAttachedToTraitement Then
                OnPropertyChanging("TableTranches")
                Dim e As New PropertyChangeEventArgs(Of DataTable)(TableTranches, value)
                If e.IsValide Then RaiseEvent TableTranchesChanging(Me, e)
                If e.IsValide Then
                    _TableTranches = e.NewValue
                    OnPropertyChanged("TableTranches")
                    RaiseEvent TableTranchesChanged(Me, e)
                End If
            End If
        End Set
    End Property
    Public Event TableTranchesChanging As PropertyChangeEventHandler(Of DataTable)
    Public Event TableTranchesChanged As PropertyChangeEventHandler(Of DataTable)
    ''' <summary>
    ''' Une ligne est ajoutée dans la dataTable
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub _dtbleCorrespTranches_RowChanged(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs)
        correspHasChanged()
    End Sub

    'Traitement de type Table_BDD associé au champs représentant une tranche
    Private WithEvents _TraitementExtractionTable As tableBDD
    Public ReadOnly Property TraitementExtractionTable As tableBDD
        Get
            Return _TraitementExtractionTable
        End Get
    End Property
    Private Sub onTraitementExtractionDataTable_EtatCalculChanged(ByVal sender As Object, ByVal e As EventArgs) Handles _TraitementExtractionTable.EtatCalculDataTableAChange
        'Si la nouvelle valeur de l'état de calcul est n'est pas à jour, il faut indiquer que la correspondance
        'a changé
        If TraitementExtractionTable.EtatCalcul_DataTable <> ValueEtatCalcul.A_JOUR Then
            RaiseEventCorrespChanged(Me, New GenerateCorrespEventArgs(Me.description))
        End If
    End Sub


    ''' <summary>
    ''' Génère le code SQL du champs (avec une clause WHERE pour prendre en compte toutes les conditions de la dataTable)
    ''' </summary>
    ''' <remarks></remarks>
    Protected Friend Overrides ReadOnly Property codeSQLSELECT(Optional ByVal withCible As Boolean = True) As String
        Get
            'Génération du champs source
            Dim strWHEN As String = ""
            strWHEN = "CASE " & vbCrLf
            For Each r As DataRow In TableTranches.Rows
                strWHEN = strWHEN & "WHEN " & _masque & " BETWEEN " & r(_nomColMin) & " AND " & r(_nomColMax) & " THEN '" & r(_nomColVal) & "'" & vbCrLf
            Next
            strWHEN = strWHEN & " END "
            'Remplacer le masque par les valeurs présentes dans la collection
            For i As Integer = 0 To _lCorrespFormule.Count - 1
                If _lCorrespFormule(i).typeChEntree <> typeChEntreeMapping.CONSTANT Then
                    If TypeOf (_lCorrespFormule(i).traitement) Is tableBDD Then
                        strWHEN = strWHEN.Replace("{" & CStr(i + 1) & "}", _
                                                  _lCorrespFormule(i).chBDD.Nom)
                    Else
                        strWHEN = strWHEN.Replace("{" & CStr(i + 1) & "}", _
                                                  _lCorrespFormule(i).chOutil.Nom)
                    End If
                Else
                    If TypeOf (_lCorrespFormule(i).traitement) Is tableBDD Then
                        strWHEN = strWHEN.Replace("{" & CStr(i + 1) & "}", _
                                                  "'" & _lCorrespFormule(i).chBDD.Nom & "'")
                    Else
                        strWHEN = strWHEN.Replace("{" & CStr(i + 1) & "}", _
                                                  _lCorrespFormule(i).chOutil.Nom)
                    End If
                End If
            Next
            If withCible Then strWHEN = strWHEN & " AS " & chOutil.Nom
            Return strWHEN
        End Get
    End Property

#End Region

    'Les évènements à gérer :
    '   - IsAttachedToTraitement est modifié : le champs n'est plus à l'écoute du traitement en entrée. La table
    '     des tranches est alors déconnectée de la dataTableResultats du traitement en entrée et peut être modifiée
    '     librement par l'utilisateur

#Region "Interception d'évènements"
#End Region

End Class

'Remarques :
'Dans une correspondance de base, on peut effectuer un changement de format
'mais pas dans une correpondance calculée

